home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / pyxmpp / stanza.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  8KB  |  255 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __revision__ = '$Id: stanza.py 676 2007-08-30 07:29:20Z jajcus $'
  5. __docformat__ = 'restructuredtext en'
  6. import libxml2
  7. import random
  8. from pyxmpp import xmlextra
  9. from pyxmpp.utils import from_utf8, to_utf8
  10. from pyxmpp.jid import JID
  11. from pyxmpp.xmlextra import common_doc, common_ns, COMMON_NS
  12. from pyxmpp.exceptions import ProtocolError, JIDMalformedProtocolError
  13. random.seed()
  14. last_id = random.randrange(1000000)
  15.  
  16. def gen_id():
  17.     global last_id
  18.     last_id += 1
  19.     return str(last_id)
  20.  
  21.  
  22. class Stanza:
  23.     stanza_type = 'Unknown'
  24.     
  25.     def __init__(self, name_or_xmlnode, from_jid = None, to_jid = None, stanza_type = None, stanza_id = None, error = None, error_cond = None, stream = None):
  26.         self._error = None
  27.         self.xmlnode = None
  28.         if isinstance(name_or_xmlnode, Stanza):
  29.             self.xmlnode = name_or_xmlnode.xmlnode.copyNode(1)
  30.             common_doc.addChild(self.xmlnode)
  31.         elif isinstance(name_or_xmlnode, libxml2.xmlNode):
  32.             self.xmlnode = name_or_xmlnode.docCopyNode(common_doc, 1)
  33.             common_doc.addChild(self.xmlnode)
  34.             
  35.             try:
  36.                 ns = self.xmlnode.ns()
  37.             except libxml2.treeError:
  38.                 ns = None
  39.  
  40.             if not ns or not (ns.name):
  41.                 xmlextra.replace_ns(self.xmlnode, ns, common_ns)
  42.             
  43.         else:
  44.             self.xmlnode = common_doc.newChild(common_ns, name_or_xmlnode, None)
  45.         if from_jid is not None:
  46.             if not isinstance(from_jid, JID):
  47.                 from_jid = JID(from_jid)
  48.             
  49.             self.xmlnode.setProp('from', from_jid.as_utf8())
  50.         
  51.         if to_jid is not None:
  52.             if not isinstance(to_jid, JID):
  53.                 to_jid = JID(to_jid)
  54.             
  55.             self.xmlnode.setProp('to', to_jid.as_utf8())
  56.         
  57.         if stanza_type:
  58.             self.xmlnode.setProp('type', stanza_type)
  59.         
  60.         if stanza_id:
  61.             self.xmlnode.setProp('id', stanza_id)
  62.         
  63.         if self.get_type() == 'error':
  64.             StanzaErrorNode = StanzaErrorNode
  65.             import pyxmpp.error
  66.             if error:
  67.                 self._error = StanzaErrorNode(error, parent = self.xmlnode, copy = 1)
  68.             elif error_cond:
  69.                 self._error = StanzaErrorNode(error_cond, parent = self.xmlnode)
  70.             
  71.         
  72.         self.stream = stream
  73.  
  74.     
  75.     def __del__(self):
  76.         if self.xmlnode:
  77.             self.free()
  78.         
  79.  
  80.     
  81.     def free(self):
  82.         if self._error:
  83.             self._error.free_borrowed()
  84.         
  85.         self.xmlnode.unlinkNode()
  86.         self.xmlnode.freeNode()
  87.         self.xmlnode = None
  88.  
  89.     
  90.     def copy(self):
  91.         return Stanza(self)
  92.  
  93.     
  94.     def serialize(self):
  95.         return self.xmlnode.serialize(encoding = 'utf-8')
  96.  
  97.     
  98.     def get_node(self):
  99.         return self.xmlnode
  100.  
  101.     
  102.     def get_from(self):
  103.         if self.xmlnode.hasProp('from'):
  104.             
  105.             try:
  106.                 return JID(from_utf8(self.xmlnode.prop('from')))
  107.             except JIDError:
  108.                 raise JIDMalformedProtocolError, "Bad JID in the 'from' attribute"
  109.             except:
  110.                 None<EXCEPTION MATCH>JIDError
  111.             
  112.  
  113.         None<EXCEPTION MATCH>JIDError
  114.         return None
  115.  
  116.     get_from_jid = get_from
  117.     
  118.     def get_to(self):
  119.         if self.xmlnode.hasProp('to'):
  120.             
  121.             try:
  122.                 return JID(from_utf8(self.xmlnode.prop('to')))
  123.             except JIDError:
  124.                 raise JIDMalformedProtocolError, "Bad JID in the 'to' attribute"
  125.             except:
  126.                 None<EXCEPTION MATCH>JIDError
  127.             
  128.  
  129.         None<EXCEPTION MATCH>JIDError
  130.         return None
  131.  
  132.     get_to_jid = get_to
  133.     
  134.     def get_type(self):
  135.         if self.xmlnode.hasProp('type'):
  136.             return from_utf8(self.xmlnode.prop('type'))
  137.         else:
  138.             return None
  139.  
  140.     get_stanza_type = get_type
  141.     
  142.     def get_id(self):
  143.         if self.xmlnode.hasProp('id'):
  144.             return from_utf8(self.xmlnode.prop('id'))
  145.         else:
  146.             return None
  147.  
  148.     get_stanza_id = get_id
  149.     
  150.     def get_error(self):
  151.         if self._error:
  152.             return self._error
  153.         
  154.         n = self.xpath_eval(u'ns:error')
  155.         if not n:
  156.             raise ProtocolError, (None, 'This stanza contains no error: %r' % (self.serialize(),))
  157.         
  158.         StanzaErrorNode = StanzaErrorNode
  159.         import pyxmpp.error
  160.         self._error = StanzaErrorNode(n[0], copy = 0)
  161.         return self._error
  162.  
  163.     
  164.     def set_from(self, from_jid):
  165.         if from_jid:
  166.             return self.xmlnode.setProp('from', JID(from_jid).as_utf8())
  167.         else:
  168.             return self.xmlnode.unsetProp('from')
  169.  
  170.     
  171.     def set_to(self, to_jid):
  172.         if to_jid:
  173.             return self.xmlnode.setProp('to', JID(to_jid).as_utf8())
  174.         else:
  175.             return self.xmlnode.unsetProp('to')
  176.  
  177.     
  178.     def set_type(self, stanza_type):
  179.         if stanza_type:
  180.             return self.xmlnode.setProp('type', to_utf8(stanza_type))
  181.         else:
  182.             return self.xmlnode.unsetProp('type')
  183.  
  184.     
  185.     def set_id(self, stanza_id):
  186.         if stanza_id:
  187.             return self.xmlnode.setProp('id', to_utf8(stanza_id))
  188.         else:
  189.             return self.xmlnode.unsetProp('id')
  190.  
  191.     
  192.     def set_content(self, content):
  193.         while self.xmlnode.children:
  194.             self.xmlnode.children.unlinkNode()
  195.         if hasattr(content, 'as_xml'):
  196.             content.as_xml(parent = self.xmlnode, doc = common_doc)
  197.         elif isinstance(content, libxml2.xmlNode):
  198.             self.xmlnode.addChild(content.docCopyNode(common_doc, 1))
  199.         else:
  200.             self.xmlnode.setContent(content)
  201.  
  202.     
  203.     def add_content(self, content):
  204.         if hasattr(content, 'as_xml'):
  205.             content.as_xml(parent = self.xmlnode, doc = common_doc)
  206.         elif isinstance(content, libxml2.xmlNode):
  207.             self.xmlnode.addChild(content.docCopyNode(common_doc, 1))
  208.         else:
  209.             self.xmlnode.addContent(content)
  210.  
  211.     
  212.     def set_new_content(self, ns_uri, name):
  213.         while self.xmlnode.children:
  214.             self.xmlnode.children.unlinkNode()
  215.         return self.add_new_content(ns_uri, name)
  216.  
  217.     
  218.     def add_new_content(self, ns_uri, name):
  219.         c = self.xmlnode.newChild(None, to_utf8(name), None)
  220.         if ns_uri:
  221.             ns = c.newNs(ns_uri, None)
  222.             c.setNs(ns)
  223.         
  224.         return c
  225.  
  226.     
  227.     def xpath_eval(self, expr, namespaces = None):
  228.         ctxt = common_doc.xpathNewContext()
  229.         ctxt.setContextNode(self.xmlnode)
  230.         ctxt.xpathRegisterNs('ns', COMMON_NS)
  231.         if namespaces:
  232.             for prefix, uri in namespaces.items():
  233.                 ctxt.xpathRegisterNs(unicode(prefix), uri)
  234.             
  235.         
  236.         ret = ctxt.xpathEval(unicode(expr))
  237.         ctxt.xpathFreeContext()
  238.         return ret
  239.  
  240.     
  241.     def __eq__(self, other):
  242.         if not isinstance(other, Stanza):
  243.             return False
  244.         
  245.         return self.xmlnode.serialize() == other.xmlnode.serialize()
  246.  
  247.     
  248.     def __ne__(self, other):
  249.         if not isinstance(other, Stanza):
  250.             return True
  251.         
  252.         return self.xmlnode.serialize() != other.xmlnode.serialize()
  253.  
  254.  
  255.